home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / comm2 / termsorc.lha / Extras / Source / term-source.lha / termAbout.c < prev    next >
C/C++ Source or Header  |  1995-09-26  |  19KB  |  862 lines

  1. /*
  2. **    termAbout.c
  3. **
  4. **    Support routines for the `About' window.
  5. **
  6. **    Copyright © 1990-1995 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termGlobal.h"
  11.  
  12. #define HEADING 4
  13.  
  14. enum    {    GAD_FRAME=1,GAD_SCROLL,GAD_BUTTON };
  15.  
  16.     /* LocalDeleteBitMap(struct BitMap *BitMap,UWORD Width,UWORD Height):
  17.      *
  18.      *    Delete yet another screen bitmap.
  19.      */
  20.  
  21. STATIC VOID __regargs
  22. LocalDeleteBitMap(struct BitMap *BitMap,UWORD Width,UWORD Height)
  23. {
  24.     if(BitMap)
  25.     {
  26.         WORD i;
  27.  
  28.         WaitBlit();
  29.  
  30.         for(i = 0 ; i < BitMap -> Depth ; i++)
  31.         {
  32.             if(BitMap -> Planes[i])
  33.                 FreeRaster(BitMap -> Planes[i],Width,Height);
  34.         }
  35.  
  36.         FreeVecPooled(BitMap);
  37.     }
  38. }
  39.  
  40.     /* LocalCreateBitMap(UWORD Depth,UWORD Width,UWORD Height):
  41.      *
  42.      *    Create yet another screen bitmap.
  43.      */
  44.  
  45. STATIC struct BitMap * __regargs
  46. LocalCreateBitMap(UWORD Depth,UWORD Width,UWORD Height)
  47. {
  48.     struct BitMap *BitMap;
  49.  
  50.     if(BitMap = (struct BitMap *)AllocVecPooled(sizeof(struct BitMap),MEMF_ANY))
  51.     {
  52.         BYTE    Success = TRUE;
  53.         WORD    i;
  54.  
  55.         InitBitMap(BitMap,Depth,Width,Height);
  56.  
  57.         for(i = 0 ; Success && i < Depth ; i++)
  58.         {
  59.             if(!(BitMap -> Planes[i] = AllocRaster(Width,Height)))
  60.                 Success = FALSE;
  61.         }
  62.  
  63.         if(Success)
  64.             return(BitMap);
  65.  
  66.         LocalDeleteBitMap(BitMap,Width,Height);
  67.     }
  68.  
  69.     return(NULL);
  70. }
  71.  
  72.     /* CreateBitMapFromImage(struct Image *Image,struct BitMap *BitMap):
  73.      *
  74.      *    Turn an Intuition Image into a Gfx BitMap.
  75.      */
  76.  
  77. STATIC VOID __regargs
  78. CreateBitMapFromImage(struct Image *Image,struct BitMap *BitMap)
  79. {
  80.     PLANEPTR    Data    = (PLANEPTR)Image -> ImageData;
  81.     ULONG        Modulo    = ((((ULONG)Image -> Width) + 15) >> 3) & ~1;
  82.     WORD        i;
  83.  
  84.     InitBitMap(BitMap,Image -> Depth,Image -> Width,Image -> Height);
  85.  
  86.     for(i = 0 ; i < Image -> Depth ; i++, Data += Modulo * Image -> Height)
  87.         BitMap -> Planes[i] = Data;
  88. }
  89.  
  90.     /* RecolourBitMap():
  91.      *
  92.      *    Remap a BitMap to use a different colour selection.
  93.      */
  94.  
  95. STATIC struct BitMap * __regargs
  96. RecolourBitMap (struct BitMap *Src, UBYTE * Mapping, UBYTE DestDepth, UWORD Width, UWORD Height)
  97. {
  98.     struct BitMap *Dst;
  99.  
  100.         /* Create the bitmap to hold the remapped data. */
  101.  
  102.     if(Dst = LocalCreateBitMap(DestDepth,Width,Height))
  103.     {
  104.         struct BitMap *SingleMap;
  105.  
  106.             /* Create a single bitplane bitmap. */
  107.  
  108.         if(SingleMap = LocalCreateBitMap(1,Width,Height))
  109.         {
  110.             struct BitMap *FullMap;
  111.  
  112.                 /* Create a dummy bitmap. */
  113.  
  114.             if(FullMap = (struct BitMap *)AllocVecPooled(sizeof(struct BitMap),MEMF_ANY))
  115.             {
  116.                 WORD i,Mask = (1L << Src -> Depth) - 1;
  117.  
  118.                     /* Make the dummy bitmap use the
  119.                      * single bitmap in all planes.
  120.                      */
  121.  
  122.                 InitBitMap(FullMap,DestDepth,Width,Height);
  123.  
  124.                 for(i = 0 ; i < DestDepth ; i++)
  125.                     FullMap -> Planes[i] = SingleMap -> Planes[0];
  126.  
  127.                     /* Clear the destination bitmap. */
  128.  
  129.                 BltBitMap(Dst,0,0,Dst,0,0,Width,Height,MINTERM_ZERO,0xFF,NULL);
  130.  
  131.                     /* Is colour zero to be mapped to a non-zero colour? */
  132.  
  133.                 if(Mapping[0])
  134.                 {
  135.                         /* Clear the single plane bitmap. */
  136.  
  137.                     BltBitMap(SingleMap,0,0,SingleMap,0,0,Width,Height,MINTERM_ZERO,1,NULL);
  138.  
  139.                         /* Merge all source bitplane data. */
  140.  
  141.                     BltBitMap(Src,0,0,FullMap,0,0,Width,Height,MINTERM_B_OR_C,Mask,NULL);
  142.  
  143.                         /* Invert the single plane bitmap, to give us
  144.                          * the zero colour bitmap we can work with.
  145.                          */
  146.  
  147.                     BltBitMap(SingleMap,0,0,SingleMap,0,0,Width,Height,MINTERM_NOT_C,1,NULL);
  148.  
  149.                         /* Now set all the bits for colour zero. */
  150.  
  151.                     BltBitMap(FullMap,0,0,Dst,0,0,Width,Height,MINTERM_B_OR_C,Mapping[0],NULL);
  152.                 }
  153.  
  154.                     /* Run down the colours. */
  155.  
  156.                 for(i = 1 ; i <= Mask ; i++)
  157.                 {
  158.                         /* Set the single plane bitmap to all 1's. */
  159.  
  160.                     BltBitMap(SingleMap,0,0,SingleMap,0,0,Width,Height,MINTERM_ONE,1,NULL);
  161.  
  162.                         /* Isolate the pixels to match the colour
  163.                          * specified in `i'.
  164.                          */
  165.  
  166.                     BltBitMap(Src,0,0,FullMap,0,0,Width,Height,MINTERM_B_AND_C,i,NULL);
  167.  
  168.                     if(Mask ^ i)
  169.                         BltBitMap(Src,0,0,FullMap,0,0,Width,Height,MINTERM_NOT_B_AND_C,Mask ^ i,NULL);
  170.  
  171.                         /* Set the pixels in the destination bitmap,
  172.                          * use the designated colour.
  173.                          */
  174.  
  175.                     BltBitMap(FullMap,0,0,Dst,0,0,Width,Height,MINTERM_B_OR_C,Mapping[i],NULL);
  176.                 }
  177.  
  178.                     /* Free the temporary bitmap. */
  179.  
  180.                 FreeVecPooled(FullMap);
  181.  
  182.                     /* Free the single plane bitmap. */
  183.  
  184.                 LocalDeleteBitMap(SingleMap,Width,Height);
  185.  
  186.                     /* Return the result. */
  187.  
  188.                 return(Dst);
  189.             }
  190.  
  191.             LocalDeleteBitMap(SingleMap,Width,Height);
  192.         }
  193.  
  194.         LocalDeleteBitMap(Dst,Width,Height);
  195.     }
  196.  
  197.     return(NULL);
  198. }
  199.  
  200. STATIC STRPTR Table[] =
  201. {
  202.     "\bBeta testing:",
  203.     "",
  204.     "Peter L. Banville Jr.   Stefan Becker",
  205.     "Abdelkader Benbachir   Martin Berndt",
  206.     "Gregory A. Chance   Keith Christopher",
  207.     "Mark Constable   Steve Corder",
  208.     "Sebastian Delmont   Marcel Döring  Klaus Dürr",
  209.     "Frank Dürring   Bernd Ernesti",
  210.     "Kenneth Fribert   Kay Gehrke",
  211.     "Jay Grizzard   Stefan Gybas",
  212.     "Christoph Gülicher   Chris Hanson",
  213.     "Peer Hasselmeyer   Christian Hechelmann",
  214.     "Holger Heinrich   Rodney Hester",
  215.     "Florian Hinzmann   Hung-Tung Hsu",
  216.     "Stefan Hudson   Kai Iske",
  217.     "Piotr Kaminski   Andreas M. Kirchwitz",
  218.     "Tony Kirkland   Stellan Klebom",
  219.     "Russell John LeBar   Jason C. Leach",
  220.     "Holger Lubitz   Daniel M. Makovec",
  221.     "Bob Maple   Julian Matthew",
  222.     "Chris Mattingly   Matthias Merkel",
  223.     "Dabe Murphy   William Michael Mushkin",
  224.     "Christopher G. Newby   Dean S. Pemberton",
  225.     "Yves Perrenoud   Olaf Peters",
  226.     "Sven Reger   Robert Reiswig",
  227.     "Matti Rintala   Alfredo Rojas",
  228.     "Karsten Rother   Ottmar Röhrig",
  229.     "Matthias Scheler   Markus Schmall",
  230.     "Robert L. Shady   Leon D. Shaner",
  231.     "Eric W. Sommer   Jason Soukeras",
  232.     "Gary B. Standen   Keith A. Stewart",
  233.     "Joel E. Swan   Jonathan Tew",
  234.     "Bodo Thevissen   Jürgen Zeschky",
  235.     "Michael Zielesny",
  236.     "",
  237.     "\bForeign language translations:",
  238.     "",
  239.     "Olaf Barthel (Deutsch)",
  240.     "Phillippe Brand (Français)",
  241.     "Thomas Egrelius (Svenska)",
  242.     "Michele Girato (Italiano)",
  243.     "Flemming Lindeblad (Dansk)",
  244.     "Edmund Vermeulen (Nederlands)",
  245.     "«Sorry, I lost your name» (Español)",
  246.     "",
  247.     "\bDocumentation:",
  248.     "",
  249.     "Olaf Barthel   Garry Glendown",
  250.     "Henning Hucke   Mike Safer",
  251.     "Mark Schröer",
  252.     "",
  253.     "\bXPR Libraries by:",
  254.     "",
  255.     "Marc Boucher (xmodem)",
  256.     "Terence Finney (bplus)",
  257.     "Rick Huebner & William M. Perkins (zmodem)",
  258.     "Ueli Kaufmann (ascii, ymodem, vms)",
  259.     "Marco Papa & Stephen Walton (kermit)",
  260.     "Jack Rouse (quickb)",
  261.     "",
  262.     "\bXEM Libraries by:",
  263.     "",
  264.     "Ueli Kaufmann (amiga, ascii, bbs, vt340)",
  265.     "Stef Rave (rip)",
  266.     "",
  267.     "\bPeople who will deny that",
  268.     "\bthey were ever involved:",
  269.     "",
  270.     "John Burton   Peter Fischer",
  271.     "David Göhler   Michael-Wolfgang Hohmann",
  272.     "David Jones   Marko Küchmann",
  273.     "Bernd Lambracht   Roby Leeman & AUGS",
  274.     "Frank Mariak   Germar Morgenthaler",
  275.     "Jürgen Otte   Till `Dill-Prince' Prinzler",
  276.     "Nicola Salmoria   Ralph Schmidt",
  277.     "Veith Schörgenhummer   Thorsten Seidel",
  278.     "Markus Stoll   Martin Taillefer",
  279.     "Christoph Teuber   Ralf Thanner",
  280.     "Volker Ulle & the Aquila Sysop Team",
  281.     "Michael Vaeth   Oliver Wagner",
  282.     "Christopher Wichura   Udo Wolt",
  283.     "Matthias Zepf",
  284.     "",
  285.     "\aDon't switch off, it's almost over!",
  286.     "",
  287.     NULL
  288. };
  289.  
  290. STATIC VOID __regargs
  291. PrintThisLine(struct RastPort *RPort,struct Rectangle *Clip,LONG Top,STRPTR Line)
  292. {
  293.     LONG Len,Width;
  294.  
  295.     Len = strlen(Line);
  296.  
  297.     if(*Line == '\b' || *Line == '\a')
  298.     {
  299.         ULONG Style;
  300.  
  301.         if(*Line == '\b')
  302.             Style = FSF_BOLD;
  303.         else
  304.             Style = FSF_ITALIC;
  305.  
  306.         SetSoftStyle(RPort,Style,FSF_BOLD | FSF_ITALIC);
  307.         Line++;
  308.         Len--;
  309.     }
  310.     else
  311.         SetSoftStyle(RPort,0,FSF_BOLD | FSF_ITALIC);
  312.  
  313.     if(Len > 0)
  314.     {
  315.         Width = TextLength(RPort,Line,Len);
  316.  
  317.         Move(RPort,Clip -> MinX + (Clip -> MaxX - Clip -> MinX + 1 - Width) / 2,RPort -> TxBaseline + Top);
  318.         Text(RPort,Line,Len);
  319.     }
  320. }
  321.  
  322.  
  323.     /* ShowAbout():
  324.      *
  325.      *    Open a window, draw the `term' logo, show some text
  326.      *    and wait for user reaction.
  327.      */
  328.  
  329. BYTE __regargs
  330. ShowAbout(BYTE Ticks)
  331. {
  332.     struct BitMap        *ImageBitMap = NULL;
  333.     LONG             ImageWidth,
  334.                  ImageHeight;
  335.     BYTE             GotRexxMessage = FALSE;
  336.     struct LayoutHandle    *Handle;
  337.  
  338.     if(IconBase)
  339.     {
  340.         struct DiskObject *Icon;
  341.  
  342.         if(Icon = GetProgramIcon())
  343.         {
  344.             STATIC UWORD DefaultColours[4] =
  345.             {
  346.                 0xAAA,
  347.                 0x000,
  348.                 0xFFF,
  349.                 0x68B
  350.             };
  351.  
  352.             UBYTE    Mapping[4];
  353.             UWORD    Colour1,Colour2;
  354.             WORD    ChannelDistance;
  355.             LONG    Distance,BestDistance,BestIndex,Depth,Count,i,j;
  356.             BOOLEAN    Duplicates = FALSE;
  357.  
  358.             Depth = GetBitMapDepth(Window -> RPort -> BitMap);
  359.             Count = Window -> WScreen -> ViewPort . ColorMap -> Count;
  360.  
  361.             if(Depth > 8)
  362.                 Depth = 8;
  363.  
  364.             if(Count > (1L << Depth))
  365.                 Count = 1L << Depth;
  366.  
  367.             if(Count > 256)
  368.                 Count = 256;
  369.  
  370.             if(Count >= 4)
  371.             {
  372.                 for(i = 0 ; i < 4 ; i++)
  373.                 {
  374.                     Colour2 = DefaultColours[i];
  375.  
  376.                     BestDistance    = 3 * 15 * 15;
  377.                     BestIndex    = 0;
  378.  
  379.                     for(j = 0 ; j < Count ; j++)
  380.                     {
  381.                         Colour1 = GetRGB4(Window -> WScreen -> ViewPort . ColorMap,j);
  382.  
  383.                         ChannelDistance = ((WORD)((Colour1 >> 8) & 0xF)) - ((WORD)((Colour2 >> 8) & 0xF));
  384.  
  385.                         Distance = ChannelDistance * ChannelDistance;
  386.  
  387.                         ChannelDistance = ((WORD)((Colour1 >> 4) & 0xF)) - ((WORD)((Colour2 >> 4) & 0xF));
  388.  
  389.                         Distance += ChannelDistance * ChannelDistance;
  390.  
  391.                         ChannelDistance = ((WORD)(Colour1 & 0xF)) - ((WORD)(Colour2 & 0xF));
  392.  
  393.                         Distance += ChannelDistance * ChannelDistance;
  394.  
  395.                         if(Distance < BestDistance)
  396.                         {
  397.                             BestDistance    = Distance;
  398.                             BestIndex    = j;
  399.                         }
  400.                     }
  401.  
  402.                     Mapping[i] = BestIndex;
  403.                 }
  404.  
  405.                 for(i = 0 ; !Duplicates && i < 4 ; i++)
  406.                 {
  407.                     for(j = i + 1 ; !Duplicates && j < 4 ; j++)
  408.                         Duplicates = (Mapping[i] == Mapping[j]);
  409.                 }
  410.  
  411.                 if(!Duplicates)
  412.                 {
  413.                     struct BitMap     LocalBitMap;
  414.                     struct Image    *Image;
  415.  
  416.                     Image = Icon -> do_Gadget . GadgetRender;
  417.  
  418.                     if(Image -> Depth == 2)
  419.                     {
  420.                         CreateBitMapFromImage(Image,&LocalBitMap);
  421.  
  422.                         if(ImageBitMap = RecolourBitMap(&LocalBitMap,Mapping,Depth,Image -> Width,Image -> Height))
  423.                         {
  424.                             ImageWidth    = Image -> Width;
  425.                             ImageHeight    = Image -> Height;
  426.                         }
  427.                     }
  428.                 }
  429.             }
  430.  
  431.             FreeDiskObject(Icon);
  432.         }
  433.     }
  434.  
  435.     if(Handle = LT_CreateHandleTags(Window -> WScreen,
  436.         LH_LocaleHook,    &LocaleHook,
  437.         LH_ExactClone,    TRUE,
  438.     TAG_DONE))
  439.     {
  440.         STRPTR             AboutLines[3],
  441.                      RequestLines[4],
  442.                      StandardMail[4],
  443.                      ElectronicMail[2];
  444.         struct Window        *PanelWindow;
  445.         WORD             i;
  446.         struct Region        *Clip = NULL,*Old;
  447.         struct Rectangle     ClipRect;
  448.         LONG             ClipWidth,
  449.                      ClipHeight;
  450.  
  451.         if(!Ticks)
  452.         {
  453.             struct RastPort    This;
  454.             ULONG        Width,MaxWidth,Len,i;
  455.             STRPTR        String;
  456.  
  457.             InitRastPort(&This);
  458.             SetFont(&This,UserTextFont);
  459.  
  460.             for(i = MaxWidth = 0 ; Table[i] ; i++)
  461.             {
  462.                 Len = strlen(String = Table[i]);
  463.  
  464.                 if(*String == '\b' || *String == '\a')
  465.                 {
  466.                     ULONG Style;
  467.  
  468.                     if(*String == '\b')
  469.                         Style = FSF_BOLD;
  470.                     else
  471.                         Style = FSF_ITALIC;
  472.  
  473.                     SetSoftStyle(&This,Style,FSF_BOLD | FSF_ITALIC);
  474.                     String++;
  475.                     Len--;
  476.                 }
  477.                 else
  478.                     SetSoftStyle(&This,0,FSF_BOLD | FSF_ITALIC);
  479.  
  480.                 if(Len > 0)
  481.                 {
  482.                     Width = TextLength(&This,String,Len);
  483.  
  484.                     if(Width > MaxWidth)
  485.                         MaxWidth = Width;
  486.                 }
  487.             }
  488.  
  489.             ClipWidth    = MaxWidth;
  490.             ClipHeight    = HEADING * This . TxHeight;
  491.  
  492.             Clip = NewRegion();
  493.         }
  494.  
  495.         for(i = 0 ; i < 2 ; i++)
  496.             AboutLines[i] = LocaleString(MSG_TERMINFO_INFOTEXT1_TXT + i);
  497.  
  498.         AboutLines[i] = NULL;
  499.  
  500.         for(i = 0 ; i < 3 ; i++)
  501.             RequestLines[i] = LocaleString(MSG_TERMINFO_INFOTEXT4_TXT + i);
  502.  
  503.         RequestLines[i] = NULL;
  504.  
  505.         for(i = 0 ; i < 3 ; i++)
  506.             StandardMail[i] = LocaleString(MSG_TERMINFO_INFOTEXT10_TXT + i);
  507.  
  508.         StandardMail[i] = NULL;
  509.  
  510.         for(i = 0 ; i < 1 ; i++)
  511.             ElectronicMail[i] = LocaleString(MSG_TERMINFO_INFOTEXT16_TXT + i);
  512.  
  513.         ElectronicMail[i] = NULL;
  514.  
  515.         LT_New(Handle,
  516.             LA_Type,    VERTICAL_KIND,
  517.         TAG_DONE);
  518.         {
  519.             LT_New(Handle,
  520.                 LA_Type,    VERTICAL_KIND,
  521.                 LA_LabelText,    TermName,
  522.             TAG_DONE);
  523.             {
  524.                 if(ImageBitMap)
  525.                 {
  526.                     LT_New(Handle,
  527.                         LA_Type,    VERTICAL_KIND,
  528.                     TAG_DONE);
  529.                     {
  530.                         LT_New(Handle,
  531.                             LA_Type,        FRAME_KIND,
  532.                             LAFR_InnerWidth,    ImageWidth,
  533.                             LAFR_InnerHeight,    ImageHeight,
  534.                             LA_DrawBox,        FALSE,
  535.                             LA_ID,            GAD_FRAME,
  536.                         TAG_DONE);
  537.  
  538.                         LT_EndGroup(Handle);
  539.                     }
  540.                 }
  541.  
  542.                 LT_New(Handle,
  543.                     LA_Type,    VERTICAL_KIND,
  544.                 TAG_DONE);
  545.                 {
  546.                     LT_New(Handle,
  547.                         LA_Type,    BOX_KIND,
  548.                         LA_Chars,    56,
  549.                         LABX_Lines,    AboutLines,
  550.                         LABX_AlignText,    ALIGNTEXT_CENTERED,
  551.                         LABX_DrawBox,    FALSE,
  552.                     TAG_DONE);
  553.  
  554.                     LT_EndGroup(Handle);
  555.                 }
  556.  
  557.                 if(!Ticks && Clip)
  558.                 {
  559.                     LT_New(Handle,
  560.                         LA_Type,    VERTICAL_KIND,
  561.                     TAG_DONE);
  562.                     {
  563.                         LT_New(Handle,
  564.                             LA_Type,    XBAR_KIND,
  565.                         TAG_DONE);
  566.  
  567.                         LT_New(Handle,
  568.                             LA_Type,        FRAME_KIND,
  569.                             LAFR_InnerWidth,    ClipWidth + 4,
  570.                             LAFR_InnerHeight,    ClipHeight + 2,
  571.                             LA_DrawBox,        FALSE,
  572.                             LA_ID,            GAD_SCROLL,
  573.                         TAG_DONE);
  574.  
  575.                         LT_EndGroup(Handle);
  576.                     }
  577.                 }
  578.  
  579.                 LT_EndGroup(Handle);
  580.             }
  581.  
  582.             LT_New(Handle,
  583.                 LA_Type,    VERTICAL_KIND,
  584.                 LA_LabelID,    MSG_V36_1030,
  585.             TAG_DONE);
  586.             {
  587.                 LT_New(Handle,
  588.                     LA_Type,    VERTICAL_KIND,
  589.                 TAG_DONE);
  590.                 {
  591.                     LT_New(Handle,
  592.                         LA_Type,    BOX_KIND,
  593.                         LA_Chars,    56,
  594.                         LABX_Lines,    RequestLines,
  595.                         LABX_AlignText,    ALIGNTEXT_CENTERED,
  596.                         LABX_DrawBox,    FALSE,
  597.                     TAG_DONE);
  598.  
  599.                     LT_EndGroup(Handle);
  600.                 }
  601.  
  602.                 LT_New(Handle,
  603.                     LA_Type,    VERTICAL_KIND,
  604.                     LA_LabelID,    MSG_V36_1031,
  605.                 TAG_DONE);
  606.                 {
  607.                     LT_New(Handle,
  608.                         LA_Type,    BOX_KIND,
  609.                         LA_Chars,    56,
  610.                         LABX_Lines,    StandardMail,
  611.                         LABX_AlignText,    ALIGNTEXT_CENTERED,
  612.                         LABX_DrawBox,    FALSE,
  613.                     TAG_DONE);
  614.  
  615.                     LT_EndGroup(Handle);
  616.                 }
  617.  
  618.                 LT_New(Handle,
  619.                     LA_Type,    VERTICAL_KIND,
  620.                     LA_LabelID,    MSG_V36_1032,
  621.                 TAG_DONE);
  622.                 {
  623.                     LT_New(Handle,
  624.                         LA_Type,    BOX_KIND,
  625.                         LA_Chars,    56,
  626.                         LABX_Lines,    ElectronicMail,
  627.                         LABX_AlignText,    ALIGNTEXT_CENTERED,
  628.                         LABX_DrawBox,    FALSE,
  629.                     TAG_DONE);
  630.  
  631.                     LT_EndGroup(Handle);
  632.                 }
  633.  
  634.                 LT_EndGroup(Handle);
  635.             }
  636.  
  637.             if(!Ticks)
  638.             {
  639.                 LT_New(Handle,
  640.                     LA_Type,VERTICAL_KIND,
  641.                 TAG_DONE);
  642.                 {
  643.                     LT_New(Handle,LA_Type,XBAR_KIND,LAXB_FullSize,TRUE,TAG_DONE);
  644.  
  645.                     LT_New(Handle,
  646.                         LA_Type,    BUTTON_KIND,
  647.                         LA_LabelID,    MSG_V36_1033,
  648.                         LA_ID,        GAD_BUTTON,
  649.                         LABT_ReturnKey,    TRUE,
  650.                         LABT_ExtraFat,    TRUE,
  651.                     TAG_DONE);
  652.  
  653.                     LT_EndGroup(Handle);
  654.                 }
  655.             }
  656.  
  657.             LT_EndGroup(Handle);
  658.         }
  659.  
  660.         if(!Ticks)
  661.         {
  662.             PanelWindow = LT_Build(Handle,
  663.                 LAWN_TitleID,        MSG_V36_1034,
  664.                 LAWN_IDCMP,        IDCMP_CLOSEWINDOW | IDCMP_INTUITICKS,
  665.                 LAWN_HelpHook,        &GuideHook,
  666.                 LAWN_MaxPen,        -1,
  667.                 LAWN_Parent,        Window,
  668.                 WA_DepthGadget,        TRUE,
  669.                 WA_CloseGadget,        TRUE,
  670.                 WA_DragBar,        TRUE,
  671.                 WA_RMBTrap,        TRUE,
  672.                 WA_Activate,        TRUE,
  673.             TAG_DONE);
  674.         }
  675.         else
  676.         {
  677.             PanelWindow = LT_Build(Handle,
  678.                 LAWN_IDCMP,        IDCMP_RAWKEY | IDCMP_MOUSEMOVE | IDCMP_MOUSEBUTTONS | IDCMP_INTUITICKS,
  679.                 LAWN_HelpHook,        &GuideHook,
  680.                 LAWN_MaxPen,        -1,
  681.                 LAWN_Parent,        Window,
  682.                 WA_RMBTrap,        TRUE,
  683.                 WA_Activate,        TRUE,
  684.                 WA_ReportMouse,        TRUE,
  685.             TAG_DONE);
  686.         }
  687.  
  688.         if(PanelWindow)
  689.         {
  690.             struct IntuiMessage    *Message;
  691.             BOOLEAN             Done = FALSE;
  692.             ULONG             MsgClass,
  693.                          MsgQualifier;
  694.             UWORD             MsgCode;
  695.             struct Gadget        *MsgGadget;
  696.             ULONG             Signals;
  697.             LONG             TickCount = 0;
  698.             LONG             Top,Total,LastLine,IntroTicks = 15;
  699.  
  700.             if(ImageBitMap)
  701.             {
  702.                 LONG Left,Top;
  703.  
  704.                 LT_GetAttributes(Handle,GAD_FRAME,
  705.                     LA_Left,    &Left,
  706.                     LA_Top,        &Top,
  707.                 TAG_DONE);
  708.  
  709.                 BltBitMapRastPort(ImageBitMap,0,0,PanelWindow -> RPort,Left,Top,ImageWidth,ImageHeight,MINTERM_COPY);
  710.             }
  711.  
  712.             if(!Ticks)
  713.             {
  714.                 LONG LeftEdge,TopEdge;
  715.  
  716.                 LT_GetAttributes(Handle,GAD_SCROLL,
  717.                     LA_Left,    &LeftEdge,
  718.                     LA_Top,        &TopEdge,
  719.                 TAG_DONE);
  720.  
  721.                 ClipRect . MinX    = LeftEdge + 2;
  722.                 ClipRect . MinY    = TopEdge + 2;
  723.                 ClipRect . MaxX    = LeftEdge + 2 + ClipWidth - 1;
  724.                 ClipRect . MaxY = TopEdge + 2 + ClipHeight - 1;
  725.  
  726.                 SetFont(PanelWindow -> RPort,UserTextFont);
  727.  
  728.                 if(Kick30)
  729.                     SetABPenDrMd(PanelWindow -> RPort,Handle -> DrawInfo -> dri_Pens[TEXTPEN],Handle -> DrawInfo -> dri_Pens[BACKGROUNDPEN],JAM2);
  730.                 else
  731.                 {
  732.                     SetAPen(PanelWindow -> RPort,Handle -> DrawInfo -> dri_Pens[TEXTPEN]);
  733.                     SetBPen(PanelWindow -> RPort,Handle -> DrawInfo -> dri_Pens[BACKGROUNDPEN]);
  734.                     SetDrMd(PanelWindow -> RPort,JAM2);
  735.                 }
  736.  
  737.                 if(OrRectRegion(Clip,&ClipRect))
  738.                 {
  739.                     LONG i;
  740.  
  741.                     Old = InstallClipRegion(PanelWindow -> WLayer,Clip);
  742.  
  743.                     Top = ClipRect . MinY;
  744.  
  745.                     for(i = 0 ; i < HEADING ; i++)
  746.                     {
  747.                         PrintThisLine(PanelWindow -> RPort,&ClipRect,Top,Table[i]);
  748.  
  749.                         Top += PanelWindow -> RPort -> TxHeight;
  750.                     }
  751.  
  752.                     LastLine = i;
  753.  
  754.                     Total = 0;
  755.                 }
  756.                 else
  757.                 {
  758.                     DisposeRegion(Clip);
  759.                     Clip = NULL;
  760.                 }
  761.             }
  762.  
  763.             while(Message = GT_GetIMsg(PanelWindow -> UserPort))
  764.                 GT_ReplyIMsg(Message);
  765.  
  766.             if(!Ticks)
  767.                 PushWindow(PanelWindow);
  768.             else
  769.                 Say(LocaleString(MSG_TERMINFO_WELCOME_TO_TERM_TXT));
  770.  
  771.             do
  772.             {
  773.                 Signals = Wait(PORTMASK(PanelWindow -> UserPort) | SIG_BREAK | SIG_REXX);
  774.  
  775.                 if(Signals & SIG_BREAK)
  776.                     break;
  777.  
  778.                 if(Ticks)
  779.                 {
  780.                     if(Signals & SIG_REXX)
  781.                     {
  782.                         GotRexxMessage = TRUE;
  783.  
  784.                         break;
  785.                     }
  786.                 }
  787.  
  788.                 while(Message = (struct IntuiMessage *)GT_GetIMsg(PanelWindow -> UserPort))
  789.                 {
  790.                     MsgClass    = Message -> Class;
  791.                     MsgQualifier    = Message -> Qualifier;
  792.                     MsgCode        = Message -> Code;
  793.                     MsgGadget    = (struct Gadget *)Message -> IAddress;
  794.  
  795.                     GT_ReplyIMsg(Message);
  796.  
  797.                     if(Ticks)
  798.                     {
  799.                         if(MsgClass == IDCMP_INTUITICKS && TickCount++ >= 50)
  800.                             Done = TRUE;
  801.  
  802.                         if((MsgClass == IDCMP_RAWKEY || MsgClass == IDCMP_MOUSEBUTTONS) && !(MsgCode & IECODE_UP_PREFIX))
  803.                             Done = TRUE;
  804.  
  805.                         if(MsgClass == IDCMP_MOUSEMOVE)
  806.                             Done = TRUE;
  807.                     }
  808.                     else
  809.                     {
  810.                         LT_HandleInput(Handle,MsgQualifier,&MsgClass,&MsgCode,&MsgGadget);
  811.  
  812.                         if(MsgClass == IDCMP_CLOSEWINDOW || MsgClass == IDCMP_GADGETUP)
  813.                             Done = TRUE;
  814.  
  815.                         if(MsgClass == IDCMP_INTUITICKS && Clip)
  816.                         {
  817.                             if(IntroTicks > 0)
  818.                                 IntroTicks--;
  819.                             else
  820.                             {
  821.                                 ScrollRaster(PanelWindow -> RPort,0,1,ClipRect . MinX,ClipRect . MinY,ClipRect . MaxX,ClipRect . MaxY);
  822.  
  823.                                 Total++;
  824.  
  825.                                 PrintThisLine(PanelWindow -> RPort,&ClipRect,Top - Total,Table[LastLine]);
  826.  
  827.                                 if(Total == PanelWindow -> RPort -> TxHeight)
  828.                                 {
  829.                                     Total = 0;
  830.  
  831.                                     LastLine++;
  832.  
  833.                                     if(!Table[LastLine])
  834.                                         LastLine = 0;
  835.                                 }
  836.                             }
  837.                         }
  838.                     }
  839.                 }
  840.             }
  841.             while(!Done);
  842.  
  843.             if(Clip)
  844.             {
  845.                 InstallClipRegion(PanelWindow -> WLayer,Old);
  846.  
  847.                 DisposeRegion(Clip);
  848.             }
  849.  
  850.             if(!Ticks)
  851.                 PopWindow();
  852.         }
  853.  
  854.         LT_DeleteHandle(Handle);
  855.     }
  856.  
  857.     if(ImageBitMap)
  858.         LocalDeleteBitMap(ImageBitMap,ImageWidth,ImageHeight);
  859.  
  860.     return(GotRexxMessage);
  861. }
  862.